export default {
  namespaced: true,
  state: {
    // 购物车数组  获取本地存储中购物车数组
    cartList: uni.getStorageSync("cartList") || []
  },
  // 相当于 vuex中的计算属性！！！ 
  getters: {
    // 购物车的商品总数量
    cartCount(state) {
      let count = 0;
      state.cartList.forEach((goods) => {
        count += goods.num;
      });
      return count;
    },
    // 计算 当期全选按钮是否要选中  =   数组里面的商品 是否都是 checked=true
    // every!!!!!
    // every 会对数组做遍历！！ 
    // every 返回值 是 true 或者 false
    // 如果 every里面的回调函数 每一个都返回了true =>every 返回值 也是true 
    isAllChecked(state) {
      return state.cartList.length && state.cartList.every(goods => goods.checked);
    },
    // 获取 用户勾选了的商品 组成新的数组！！！  
    checkedCartList(state) {
      return state.cartList.filter(goods => goods.checked);
    },

    // 计算 要购买（checked=true）的商品的总数量 
    totalCount(state, getters) {
      let totalCount = 0;
      getters.checkedCartList.forEach(goods => totalCount += goods.num)
      return totalCount;
    },
    // 计算要购买（checked=true）总价格  
    totalPrice(state, getters) {
      let totalPrice = 0;
      getters.checkedCartList.forEach(goods => totalPrice += goods.num * goods.goods_price)
      return totalPrice;
    }
  },
  mutations: {
    // 添加商品
    // payload= {value:当前要添加的商品对象 }
    cartAdd(state, payload) {
      // 判断当前数据是否存在于数组中 

      const index = state.cartList.findIndex(goods => goods.goods_id === payload.value.goods_id);
      if (index === -1) {
        // 不存在  数组push 
        state.cartList.push({ ...payload.value, num: 1, checked: true });
      } else {
        // 存在 修改数组中元素的购买数量即可
        state.cartList[index].num++
      }
      // 存一份到缓存中
      uni.setStorageSync("cartList", state.cartList)
    },
    // 根据商品的id做切换选中
    cartToggleCheck(state, payload) {
      /* 
      1 根据商品的id 找到元素在数组中的位置 下标 index 
      2 数组[下标].checked = ! 数组[下标].checked;
      3 存一份到缓存中
       */
      const index = state.cartList.findIndex(goods => goods.goods_id === payload.value)
      state.cartList[index].checked = !state.cartList[index].checked;
      // 存一份到缓存中
      uni.setStorageSync("cartList", state.cartList)

    },
    // 根据商品的id 做数量的更新
    cartNumUpdate(state, payload) {
      // 1 根据商品的id 找到元素在数组中的位置 下标 index 
      const index = state.cartList.findIndex(goods => goods.goods_id === payload.value.goods_id)
      // 2 数组[下标].num+=-1
      state.cartList[index].num += payload.value.unit;
      // 存一份到缓存中
      uni.setStorageSync("cartList", state.cartList)
    },
    // 根据商品的id，删除数组中元素
    cartItemDelete(state, payload) {
      const index = state.cartList.findIndex(goods => goods.goods_id === payload.value)
      state.cartList.splice(index, 1);
      uni.setStorageSync("cartList", state.cartList)
    },
    // 根据当前全选状态 来设置 购物车元素中商品的选中状态
    cartAllToggle(state, payload) {
      // mutations 获取到 getters里面的属性

      // arguments 获取到 该方法的所有的形参  原生js就支持
      // console.log(payload.value);

      // 获取到取反后的 全选状态
      const isAllChecked = !payload.value;
      state.cartList.forEach(goods => goods.checked = isAllChecked);
      uni.setStorageSync("cartList", state.cartList)

    }
  },
  actions: {

  }
}